package com.xinqi.modules.course.clazz.service;

import com.xinqi.common.base.response.PageInfo;
import com.xinqi.common.base.response.Param;
import com.xinqi.common.base.user.Account;
import com.xinqi.modules.course.clazz.domain.ClassGroupEntity;
import com.xinqi.modules.course.clazz.domain.ClassGroupStudentEntity;
import com.xinqi.modules.course.clazz.dto.req.*;
import com.xinqi.modules.course.clazz.dto.rsp.ClassGroupResultDTO;
import com.xinqi.modules.course.clazz.dto.rsp.ClassGroupStudentResultDTO;

import java.util.List;
import java.util.Map;

/**
 * 班级分组人员表服务层
 *
 * @author: system
 * @date: 2023/01/17
 */
public interface ClassGroupStudentService {
    /**
     * 分页查询 班级分组人员表数据
     */
    PageInfo<ClassGroupStudentResultDTO> page(Param pageable, ClassGroupStudentQueryDTO query);

    /**
     * 查询 班级分组人员表数据
     */
    List<ClassGroupStudentResultDTO> find(ClassGroupStudentQueryDTO query);

    /**
     * 根据id查询 班级分组人员表数据
     */
    ClassGroupStudentResultDTO findById(Long id);

    /**
     * 添加组员
     */
    Long insert(ClassGroupStudentCreateDTO dto);

    /**
     * 根据id修改 班级分组人员表数据
     */
    Boolean updateById(ClassGroupStudentUpdateDTO dto);

    /**
     * 根据id删除 班级分组人员表数据
     */
    Boolean deleteByClassGroupStudentId(Account user, Long id);

    Boolean setTeamLeader(ClassGroupStudentUpdateDTO dto);

    Boolean cancelTeamLeader(ClassGroupStudentUpdateDTO dto);

    Boolean batchUpdate(Long targetGroupId, Long sourceGroupId, List<ClassGroupStudentUpdateDTO> dtoList);

    Boolean joinFreeTeam(ClassGroupStudentCreateDTO dto);

    /**
     * 删除分组--同步删除分组下的小组成员
     *
     * @param groupIds    分组下小组ID集合
     * @param groupEntity 分组信息
     * @return
     */
    Boolean deleteByGroupId(List<Long> groupIds, ClassGroupEntity groupEntity);

    /**
     * 删除小组--同步删除小组成员
     *
     * @param groupId     小组ID
     * @param studentIds  学生ID集合
     * @param groupEntity 小组信息
     * @return
     */
    Boolean deleteByGroupId(Long groupId, List<Long> studentIds, ClassGroupEntity groupEntity);

    Boolean batchDelete(Account user, List<ClassGroupStudentDeleteDTO> dtoList);

    List<ClassGroupStudentResultDTO> findStudentList(ClassGroupStudentQueryDTO dto);

    List<ClassGroupStudentResultDTO> findStudentListByClassIdAndPid(Long classId, Long pid);

    ClassGroupStudentEntity findByGroupIdAndIsGroupLeader(Long groupId, Integer isLeader);

    List<ClassGroupStudentEntity> findListByGroupId(Long groupId);

    List<ClassGroupStudentEntity> findListByIds(List<Long> idList);

    List<ClassGroupStudentResultDTO> findListByCourseId(Long courseId);

    /**
     * 批量添加组员
     *
     * @param dto
     * @return
     */
    Boolean insertBatch(List<ClassGroupStudentCreateDTO> dto);

    /**
     * 系统随机分组 -- 保存数据
     *
     * @param list
     * @return
     */
    Boolean randomSaveStudent(List<ClassGroupStudentCreateDTO> list);

    Integer findClassTotalStudentCount(Long classId);

    List<ClassGroupStudentResultDTO> findByPidAndSign(ClassGroupSignQueryDTO dto);

    ClassGroupStudentResultDTO findByPidAndStudentId(Long id, Long userId);

    Integer removeSelf(Long classGroupId);

    Map<Long, Integer> findInsideGroupStudentCountByGroups(Long classId, List<ClassGroupResultDTO> groupList);

    List<ClassGroupStudentResultDTO> findStudentListByGroupIds(List<Long> groupIds);

    Boolean deleteByClassIdAndStudentIdList(Account user, Long classId, List<Long> studentIdList);

    List<ClassGroupStudentEntity> findByClassIdList(List<Long> classIdList);

    void transferCourseClassGroupStudentList(Long newCourseId, List<ClassGroupStudentEntity> classGroupStudentList);

    List<ClassGroupStudentEntity> findByClassIdAndStudentId(Long classId, Long studentId);

    /**
     * 批量添加分组学生信息
     */
    boolean saveAllBatch(List<ClassGroupStudentEntity> list);

    /**
     * 校验学生是否已经在组里
     */
    List<ClassGroupStudentEntity> checkStudentInGroup(List<Long> groupIds, Long studentId);

}
